#include <curl/curl.h>
#include <log/log.h>
#include <stdlib.h>
#include <string.h>

/**
 * 接收响应数据的回调函数
 * ptr： 响应数据指针
 * size： 响应数据大小
 * nmemb： 响应数据个数
 * stream: 数据容器  前面配置输入的
 */
size_t receive_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
    // 服务器返回的数据
    char *resp_data = (char *)ptr;
    // 数据大小
    int data_len = size * nmemb;
    // 前面输入的json容器
    char *json = (char *)stream;
    // 将响应数据写入json容器
    memcpy(json, resp_data, data_len);
    // 写入一个结束符
    json[data_len] = '\0';

    // 返回数据长度
    return data_len;
}

/**
 * 请求获取json数据
 */
char *ota_http_getJson(char *url)
{
    // 创建curl对象
    CURL *curl = curl_easy_init();
    // 设置请求的url
    curl_easy_setopt(curl, CURLOPT_URL, url);
    // 设置接收响应数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receive_callback);
    // 设置向接收响应数据的回调函数的参数（数据容器）
    char *json = malloc(1024);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, json);

    // 执行请求
    CURLcode code = curl_easy_perform(curl);
    if (code != CURLE_OK)
    {
        log_error("请求 %s 失败", url);
        free(json);
        // 释放curl对象
        curl_easy_cleanup(curl);

        return NULL;
    }

    // 释放curl对象
    curl_easy_cleanup(curl);

    // 返回得到的json数据
    return json;
}

 /**
  * 请求下载文件
  */
int ota_http_download(char *url, char *filename)
{
    // 初始curl
    CURL *curl = curl_easy_init();
    // 配置请求的url
    curl_easy_setopt(curl, CURLOPT_URL, url);

    // 配置接收响应数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);

    // 配置接收响应数据的回调函数的参数（File *）
    FILE *file = fopen(filename, "wb");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);

    // 执行请求
    CURLcode code = curl_easy_perform(curl);
    // 请求失败处理
    if (code != CURLE_OK)
    {
        log_error("请求 %s 失败", url);
        // 关闭文件
        fclose(file);
        // 释放curl对象
        curl_easy_cleanup(curl);
        return -1;
    }
    // 请求成功处理
    // 关闭文件
    fclose(file);
    // 释放curl对象
    curl_easy_cleanup(curl);
    
    return 0;
}